// 示例
// let a = async () => {
//     return new Promise((resolve, reject) => {
//         setTimeout(() => {
//             console.log('xhr1')
//             resolve('xhr1')
//         }, 5000)
//     })
// }

// let b = async () => {
//     return new Promise((resolve, reject) => {
//         setTimeout(() => {
//             console.log('xhr2')
//             resolve('xhr2')
//         }, 3000)
//     })
// }
// // // 从右向左执行
// let steps = [a, b]
// let composeFn = compose(...steps)
// composeFn()
type PromiseFn = () => Promise<any>
function compose(...args: PromiseFn[]) {
  if (!args) throw new Error('parameter are required')
  if (!Array.isArray(args)) throw new Error('parameter must be Array')
  const lastFn = args.pop()
  if (lastFn) {
    return function (...arg: any) {
      return args.reverse().reduce(function (sequence, func) {
        return sequence.then(function (result: any) {
          return func.call(null, result)
        })
        // eslint-disable-next-line prefer-spread
      }, Promise.resolve(lastFn.apply(null, arg)))
    }
  } else {
    throw new Error('Nonexecutable function')
  }
}
export default compose
// Function.prototype.after = function(fn) {
//     const self = this
//     return function(...args) {
//       let result = self.apply(null, args)
//       return fn.call(null,result)
//     }
//   }
//   const compose = function(...args) {
//     if (args.length) {
//       return args.reverse().reduce(function(f1, f2) {
//         return f1.after(f2)
//       })
//     }
//   }
//   const getCountStepAttr = function(args,N){
//       // 获取前 N 步的入参；
//       N = N -1
//       let resObj = args[0]
//       for(let i =0;i<N;i++){
//           resObj = resObj.args[0]
//       }
//       return resObj
//   }
//   function init(...args){
//       console.log("【在 init 中调用原始传参】：",getCountStepAttr(args,1))
//       return {args:args,init1:"init1",init:"init"}
//   }
//   function step1(...args){
//       return {args:args,step1:"step1"}
//   }
//   function step2(...args){
//       return {args:args,step2:"param-step2",step2Add:"param-step2-add"}
//   }
//   function step3(...args){
//       console.log("【在 step3 中调用 step2 的传参】：",getCountStepAttr(args,1).step2 , getCountStepAttr(args,1).step2Add)
//       console.log("【在 step3 中调用 init 的传参】：",getCountStepAttr(args,3).init , getCountStepAttr(args,3).init1)
//       console.log("【在 step3 中调用原始传参】：",getCountStepAttr(args,4))
//       return {args:args,step3:"step3"}
//   }
//   compose(step3,step2,step1,init)("start")
